/* garbage.c */
#include "Python.h" //包含Python.h文件，该文件包含Python API的头文件
#include <stdio.h>  //包含stdio.h文件，该文件包含标准输入输出函数
#include <stdlib.h> //包含stdlib.h文件，该文件包含标准函数库
#include <string.h> //包含string.h文件，该文件包含字符串处理函数
#include "garbage.h"

void garbage_init() // 初始化函数
{
    Py_Initialize(); // 初始化Python解释器

    // 将当前路径添加到sys.path列表中
    PyObject *sys = PyImport_ImportModule("sys");         // 导入sys模块
    PyObject *path = PyObject_GetAttrString(sys, "path"); // 获取sys.path属性
    PyList_Append(path, PyUnicode_FromString("."));       // 添加当前路径到sys.path列表中
}

void garbage_destroy() // 销毁函数
{
    Py_Finalize(); // 关闭Python解释器
}

char *garbage_category(char *category)
{
    // 导入模块
    PyObject *module = PyImport_ImportModule("tuxiangTest2"); // 导入tuxiangTest2模块
    if (module == NULL)
    {
        PyErr_Print();                           // 打印错误信息
        printf("加载Python_printStr模块失败\n"); // 输出错误信息
        goto FAILED_MODULE;                      // 跳转到失败处理
    }

    // 获取print_Python对象
    PyObject *pfunc = PyObject_GetAttrString(module, "alibaba_garbage"); // 获取alibaba_garbage函数
    if (pfunc == NULL || !PyCallable_Check(pfunc))
    {                                         // 判断print_String对象是否可调用
        PyErr_Print();                        // 打印错误信息
        printf("获取print_String对象失败\n"); // 输出错误信息
        goto FAILED_FUNC;                     // 跳转到失败处理
    }

    // 调用print_String函数并获取返回值
    PyObject *pValue = PyObject_CallObject(pfunc, NULL); // 调用print_String函数
    if (pValue == NULL)
    {
        PyErr_Print();                        // 打印错误信息
        printf("调用print_String函数失败\n"); // 输出错误信息
        goto FAILED_VALUE;                    // 跳转到失败处理
    }

    // 将返回值转换成C类型并输出
    char *result = NULL; // 定义C字符串变量

    if (PyArg_Parse(pValue, "s", &result) == 0)
    {                                                   // 将返回值转换成C类型
        PyErr_Print();                                  // 打印错误信息
        printf("调用print_String函数返回值转换失败\n"); // 输出错误信息
        goto FAILED_RESULT;                             // 跳转到失败处理
    }
    printf("return value: %s\n", result); // 输出返回值

    category = (char *)malloc(sizeof(char) * (strlen(result) + 1)); // 分配内存空间
    memset(category, 0, strlen(result) + 1);                        // 清空内存
    strncpy(category, result, strlen(result));                      // 拷贝字符串到category变量

    // 释放所有引用的Python对象
FAILED_RESULT:
    Py_DECREF(pValue); // 释放返回值引用
FAILED_VALUE:
    Py_DECREF(pfunc); // 释放函数引用
FAILED_FUNC:
    Py_DECREF(module); // 释放模块引用
FAILED_MODULE:

    return category;
}
